# [安洵杯 2020] easyaes
#!/usr/bin/python | |
from Crypto.Cipher import AES  | |
import binascii | |
from Crypto.Util.number import bytes_to_long  | |
from flag import flag  | |
from key import key  | |
iv = flag.strip(b'd0g3{').strip(b'}')  | |
LENGTH = len(key)  | |
assert LENGTH == 16  | |
hint = os.urandom(4) * 8  | |
print(bytes_to_long(hint)^bytes_to_long(key))  | |
msg = b'Welcome to this competition, I hope you can have fun today!!!!!!'  | |
def encrypto(message):  | |
aes = AES.new(key,AES.MODE_CBC,iv)  | |
return aes.encrypt(message)  | |
print(binascii.hexlify(encrypto(msg))[-32:])  | |
''' | |
56631233292325412205528754798133970783633216936302049893130220461139160682777  | |
b'3c976c92aff4095a23e885b195077b66'  | |
'''  | 
首先可以看到 hint 是 32 位的
而 key 只有 16 位
并且 hint 是 4 位重复 8 次
那么就可以就出 key
b=56631233292325412205528754798133970783633216936302049893130220461139160682777  | |
from Crypto.Util.number import *  | |
hint=b'}4$d'*4  | |
#print(long_to_bytes(bytes_to_long(hint)^b)) | |
key=b'd0g3{welcomeyou}'  | 
然后我们已知最后 16 位加密得到的密文
那么通过密文解密然后与明文异或得到前一个密文

参看
key=b'd0g3{welcomeyou}'  | |
def decrypt(message):  | |
aes = AES.new(key,AES.MODE_ECB)  | |
return aes.decrypt(message)  | |
a='3c976c92aff4095a23e885b195077b66'  | |
a=unhexlify(a)  | |
print(a)  | |
mssg=[]  | |
for i in range(4):  | |
mssg.append(msg[i*16:i*16+16])  | |
#print(mssg) | |
c=long_to_bytes(bytes_to_long(decrypt(a))^bytes_to_long(mssg[3]))  | |
c=long_to_bytes(bytes_to_long(decrypt(c))^bytes_to_long(mssg[2]))  | |
c=long_to_bytes(bytes_to_long(decrypt(c))^bytes_to_long(mssg[1]))  | |
iv=long_to_bytes(bytes_to_long(decrypt(c))^bytes_to_long(mssg[0]))  | |
print(iv)  | 
